package com.zy.order.base;


import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;
import java.util.List;

/**
 * description 服务接口实现类基类
 *
 * @author ZY
 * @date 2021年04月11日 19:45
 **/
@Slf4j
public abstract class BaseServiceImpl<T, ID, EXAMPLE> implements BaseService<T, ID, EXAMPLE> {

    /**
     * 定义抽象方法getDao获取当前实体Mapper对象
     *
     * @return 当前实体Mapper对象
     */
    protected abstract BaseDao<T> getDao();

    /**
     * 1根据主键获取对象
     *
     * @param key 主键
     * @return 实体对象
     */
    @Override
    public T getByPrimaryKey(ID key) {
        return getDao().selectByPrimaryKey(key);
    }

    /**
     * 2根据条件查询列表
     *
     * @param example 条件参数
     * @return 返回满足条件的集合
     */
    @Override
    public List<T> selectByExample(EXAMPLE example) {
        return getDao().selectByExample(example);
    }

    /**
     * 3单个实体对象全量字段保存
     *
     * @param record 待新增的对象
     * @return 返回新增的对象
     */
    @Override
    public T insert(T record) {
        int res = getDao().insert(record);
        // 打印操作日志(后续可以记录到表中)
        log.info("操作类型：{}，操作对象：{}，操作结果：{}，操作时间：{}，所处的类：{}", "insert", JSON.toJSONString(record), res == 1 ? "成功" : "失败", new Date(), record.getClass());
        if (res == 1) {
            return record;
        } else {
            return null;
        }
    }

    /**
     * 4单个实体对象非空字段保存
     *
     * @param record 待新增的对象
     * @return 返回新增的对象
     */
    @Override
    public T insertSelective(T record) {
        int res = getDao().insertSelective(record);
        // 打印操作日志(后续可以记录到表中)
        log.info("操作类型：{}，操作对象：{}，操作结果：{}，操作时间：{}，所处的类：{}", "insert", JSON.toJSONString(record), res == 1 ? "成功" : "失败", new Date(), record.getClass());
        if (res == 1) {
            return record;
        } else {
            return null;
        }
    }

    /**
     * 5多个实体对象保存
     *
     * @param list 待新增的实体对象集合
     * @return 返回新增的实体对象的数量
     */
    @Override
    public int insertList(java.util.List<? extends T> list) {
        int res = getDao().insertList(list);
        list.forEach(record -> log.info("操作类型：{}，操作对象：{}，操作结果：{}，操作时间：{}，所处的类：{}", "insert", JSON.toJSONString(record), res >= 1 ? "成功" : "失败", new Date(), record.getClass()));
        return res;
    }

    /**
     * 6单个实体对象主键删除
     *
     * @param key 主键
     * @return 1.成功 0.失败
     */
    @Override
    public int deleteByPrimaryKey(ID key) {
        int res = getDao().deleteByPrimaryKey(key);
        log.info("操作类型：{}，操作对象：{}，操作结果：{}，操作时间：{}", "delete", key, res == 1 ? "成功" : "失败", new Date());
        return res;
    }

    /**
     * 7单个实体对象删除
     *
     * @param record 删除的对象
     * @return 1.成功 0.失败
     */
    @Override
    public int delete(T record) {
        int res = getDao().delete(record);
        log.info("操作类型：{}，操作对象：{}，操作结果：{}，操作时间：{}，所处的类：{}", "delete", JSON.toJSONString(record), res == 1 ? "成功" : "失败", new Date(), record.getClass());
        return res;
    }

    /**
     * 8单个实体对象条件删除
     *
     * @param record  删除的对象
     * @param example 条件对象
     * @return 1.成功 0.失败
     */
    @Override
    public int deleteByExample(T record, EXAMPLE example) {
        int res = getDao().deleteByExample(example);
        log.info("操作类型：{}，操作对象：{}，操作结果：{}，操作时间：{}，所处的类：{}", "delete", JSON.toJSONString(example), res == 1 ? "成功" : "失败", new Date(), record.getClass());
        return res;
    }

    /**
     * 9单个实体对象主键全量字段更新
     *
     * @param record 待更新的对象
     * @return 1.成功 0.失败
     */
    @Override
    public int updateByPrimaryKey(T record) {
        int res = getDao().updateByPrimaryKey(record);
        log.info("操作类型：{}，操作对象：{}，操作结果：{}，操作时间：{}，所处的类：{}", "update", JSON.toJSONString(record), res == 1 ? "成功" : "失败", new Date(), record.getClass());
        return res;
    }

    /**
     * 10单个实体对象主键非空字段更新
     *
     * @param record 待更新的对象
     * @return 1.成功 0.失败
     */
    @Override
    public int updateByPrimaryKeySelective(T record) {
        int res = getDao().updateByPrimaryKeySelective(record);
        log.info("操作类型：{}，操作对象：{}，操作结果：{}，操作时间：{}，所处的类：{}", "update", JSON.toJSONString(record), res == 1 ? "成功" : "失败", new Date(), record.getClass());
        return res;
    }

    /**
     * 11单个实体对象条件全量字段更新
     *
     * @param record  待更新的对象
     * @param example 条件
     * @return 1.成功 0.失败
     */
    @Override
    public int updateByExample(T record, EXAMPLE example) {
        int res = getDao().updateByExample(record, example);
        log.info("操作类型：{}，操作对象：{}，操作结果：{}，操作时间：{}，所处的类：{}", "update", JSON.toJSONString(example), res == 1 ? "成功" : "失败", new Date(), record.getClass());
        return res;
    }

    /**
     * 12单个实体对象条件非空字段更新
     *
     * @param record  待更新的对象
     * @param example 条件
     * @return 1.成功 0.失败
     */
    @Override
    public int updateByExampleSelective(T record, EXAMPLE example) {
        int res = getDao().updateByExampleSelective(record, example);
        log.info("操作类型：{}，操作对象：{}，操作结果：{}，操作时间：{}，所处的类：{}", "update", JSON.toJSONString(example), res == 1 ? "成功" : "失败", new Date(), record.getClass());
        return res;
    }
}